home *** CD-ROM | disk | FTP | other *** search
/ Merciful 4 / Merciful - Disc 4.iso / software / p / psychotoads.dms / psychotoads.adf / a2023 < prev    next >
Text File  |  1989-03-31  |  56KB  |  1,591 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.                             20: DICS ACCESS                                260
  10.                       ---------------------------
  11.  
  12. The AMOS disc commands give you total access to the Amiga's filing
  13. system. These can be exploited to create anything from a simple reader
  14. to a fully fledged database.  
  15.  
  16.  
  17. Drives and volumes
  18. ==================
  19. As you know, the Amiga lets you label your discs in a number of
  20. different ways. If you're unfamiliar with the CLI, you may find some of
  21. these terms a little confusing. So I'll now provide you with a brief
  22. explanation of the varoius naming conventions:
  23.  
  24.  
  25. Drives
  26. ------
  27. Floppy Drives: Are assigned names in the following format
  28.  
  29.         DFn:
  30.  
  31. n is a single digit which holds the number of your drive. The first
  32. floppy drive in your system (usually the internal drive) is known as
  33. DF0: then comes drives DF1:, DF2: and DF3: if they're installed.
  34.  
  35. Hard drives: These are specified using:
  36.  
  37.         DHn:
  38.  
  39. Where n is the number of your hard drive (or a partition on it).
  40.  
  41.  
  42. Volumes
  43. -------
  44. The Amiga also creates a separate VOLUME name for each individual disc.
  45. Tihs label can be substituted for the drive name in any of your AMOS
  46. Basic commands. AMOS will automatically check each available drive for
  47. the required disc. If it can't be found, you'll get a "drive not
  48. mounted" error.
  49.  
  50.   Whenever you prepare a new disc from the Workbench, the disc will be
  51. assigned the name "Empty". To change this label from the WB, simply        261
  52. click on the RENAME option and enter your new name in the dialogue box
  53. provided. This name can be practically any string of characters you
  54. like, but it must be terminated with a colon character when it's used
  55. in your programs, just like the drive name. Here are some typical
  56. volume names for you to examine:
  57.  
  58.         AMOS:
  59.         AMOS_DATA:
  60.  
  61. WARNING! If you create several discs with the same name or swarp them
  62. around indiscriminately, the Amiga can easily get confudsed as to which
  63. disc you are actually referring to. In these circumstances, you'll need
  64. to enter the drive name instead. This will tell AMOS precisely where
  65. the required disc can be found on your system.
  66.  
  67.   You are strongly recommended to assign a different name to each and
  68. every disc you use. This takes no more than a couple of secs from the
  69. WB but it does simplify things enormously.
  70.  
  71.  
  72. Logical devices
  73. ---------------
  74. Finally, there's also a set of objects known as logical devices. These
  75. are used by the Amiga's operating routines to determine the precise
  76. position of important systems files such has device handlers or fonts.
  77. Each device is normally assigned to a specific directory on the current
  78. start-up disc. Here are some examples used by AMOS.
  79.  
  80.         FONTS:  A directory containing the current fonts.
  81.         LIBS:   Holds a library files required byt the AMOS SAY command.
  82.  
  83.  
  84. Cross Dos
  85. ---------
  86. If you've bought the separate CROSS DOS package and installed it into
  87. memory, you'll also be able to access IBM or ST format discs within
  88. AMOS Basic. These discs are assigned names starting with letters DI.
  89.  
  90.         DIn:    (where n is the number of your drive)
  91.  
  92. In order to convert your STOS programs to AMOS Basic, you'll need to
  93. save them in ASCII format using the FSAVE "*.ASC" option from STOS.
  94. Then insert the disc into an Amiga floppy drive that has been mounted
  95. by Cross-Dos as an IBM drive.
  96.  
  97.   Due to the differences between AMOS and STOS, many STOS progs will
  98. require modifying slightly before they will run under AMOS.
  99.  
  100.  
  101. Directory changing                                                         262
  102. ==================
  103.  
  104.  
  105.            DIR (print out the directory of the current disc)
  106.  
  107. DIR [PATH$] [/W]
  108.  
  109. Lists all the files on the current disc. If the optional path$ is
  110. specified, only the files which satisfy a certain set of conditions
  111. will be displayed. Any folders in the listing will be distinguished by
  112. a leading "*" character.
  113.  
  114.   The listing can be halted at any time by pressing the spacebar. To
  115. resume, simply press the spacebar once again.
  116.  
  117.   Note that if you change discs and try to get a directory listing, you
  118. may be presented with a "device not mounted" error. This is because
  119. you've removed the current disc without informing AMOS Basic. The
  120. solution is to simply update the current directory name to the new
  121. using a line like: DIR$="DF0:" before calling DIR
  122.  
  123.   /W lists the files in two columns across the screen. This effectively
  124. doubles the number of files which can be displayed at any one time. The
  125. path string consists of three main elements:
  126.  
  127.         [Disc:][Directory/] Filter.
  128.  
  129. Filter defines a set of conditions which should be satisfied for each
  130. file in your listing.
  131.  
  132.    Normal Text: Each character in your text should match exactly one
  133.                 character in the filename to be displayed. Example:
  134.  
  135.         Dir "Music"
  136. ( result : Music )
  137.  
  138.    * (asterix): Match any list of letters in your filenames up to the      263
  139.                 next control character.
  140.  
  141.  
  142.         Dir "M*"
  143.  
  144. As a default, this option will ignore any files which include an MS-DOS
  145. type extension. So a file lake: Mad.Asc  on the disc would not be
  146. listed.
  147.  
  148.    . (period): Matches the extension of a filename. It's commonly used
  149.                in conjunction with the "*" command to list all files
  150.                with a particular extension.
  151.  
  152.    ? (question mark): Matchces a single character at the current
  153.                       position.
  154.  
  155.  
  156.  
  157.                    =DIR$= (change current directory)
  158.  
  159. s$=DIR$
  160. DIR$=s$
  161.  
  162. DIR$ contains the directory which will be used as the starting point
  163. for all future disc operations, such as loading and saving. It's very
  164. similar to the CD command from the CLI, with the added advantage of
  165. allowing you to read the directory as well as just change it. Examples
  166. of the usage:
  167.  
  168.         Print Dir$
  169.         Dir$="AMOS:Iff/"
  170.  
  171.  
  172.  
  173.             PARENT (sets the current path up one directory)                264
  174.  
  175. PARENT 
  176.  
  177. The action of PARENT is to load the current directory with the parent
  178. of the present folder. By repeatedly using this command, you can
  179. quickly get back to your original root directory.
  180.  
  181.  
  182.  
  183.                     SET DIR (set style used by DIR)
  184.  
  185. SET DIR n[,filter$]
  186.  
  187. Sets the style of your directory listings. n is the number of
  188. characters ranging from 1-100 which will be displayed in each filename.
  189. Note that this setting has NO effect on the actual length of your
  190. names. It only changes the way they will be listed on the screen.
  191.  
  192.   "filter" is a list of pathnames which are to be EXCLUDED from your
  193. directory searches. All filenames that match this filter are completely
  194. ignored and will not be displayed as part of your directory. This can
  195. be used to supress the annoying ".INFO" files which cointain the icon
  196. definitions used by the WB. Note that it's possible to ignore a whole
  197. list of filepaths at once. Simply terminate each name with a single "/"
  198. character. As a default, the filter is set to:
  199.  
  200.         ".INFO/*.INFO/*.*.INFO"
  201.  
  202.  
  203.  
  204. Common disc operations                                                     265
  205. ======================
  206.  
  207.  
  208.                         DFREE (disc free space)
  209.  
  210. f=DFREE
  211.  
  212. Returns the amount of free space remaining in bytes on the current disc.
  213.  
  214.  
  215.  
  216.                         MKDIR (create a folder)
  217.  
  218. MKDIR f$
  219.  
  220. Creates a new folder on the disc with the name f$. Example:
  221.  
  222.         MkDir " Df0:TEST"
  223.  
  224.  
  225.  
  226.                    KILL (erase a file from the disc)
  227.  
  228. KILL f$
  229.  
  230. Deletes the file f$ from the current disc.
  231.  
  232.  
  233.  
  234.                         RENAME (rename a file)
  235.  
  236. RENAME old$ TO new$
  237.  
  238. Changs the name of a file.
  239.  
  240.  
  241. Selecting a file                                                           266
  242. ================
  243.  
  244.  
  245.                         =FSEL$ (select a file)
  246.  
  247. f$=FSEL$(path$[,default$][,title1$,title2$])
  248.  
  249. This function lets you choose your files directly from the disc, using
  250. the standard AMOS file selector.
  251.  
  252.   "path$" sets a search pattern which determines which files will be
  253. displayed in your listing.
  254.  
  255.   After you've selected a file, FSEL$ will reuturn either its full
  256. pathname, or an empty string "" if you selected QUIT.
  257.  
  258.   "default$" chooses a filename to be used as a default.
  259.  
  260.   "title1$" and "title2$" are optional text strings which describe a
  261. title to be displayed at the top of your file selector. Example:
  262.  
  263.         F$=Fsel$("*.IFF","","Load an IFF File")
  264.         If F$="" Then Edit : Rem Return to editor if no file was chosen.
  265.         Load IFF F$,0
  266.  
  267.  
  268. Running an AMOS program from disc
  269. =================================
  270.  
  271.  
  272.                   RUN (execute an AMOS Basic program)
  273.  
  274. RUN [file$]
  275.  
  276. Although it's easy enough to execute your progs straight from the
  277. editor, we've also included a separate RUN command. This version of the
  278. command without file$ can only be used from direct mode.
  279.  
  280.   But the RUN file$ statement may also be placed inside a Basic
  281. program. This allows you to chain a list of programs together. Note
  282. that when you run a program in this way, the existing program will be
  283. removed from memory and any variables will be lost. Any data screens
  284. that have been created though, will remain intact, thus allowing
  285. intermediate loading screens to be displayed.
  286.  
  287.   This command is fantastically useful, as it allows you to split any
  288. AMOS game into a number of levels which can be loaded separately from
  289. the disc. Each level can now be writeen as a completely independent
  290. program. So the only limit to the size of your games is the amount of
  291. storage space on the disc! You can therefore produce some massive games
  292. with this system!
  293.  
  294. See also PRUN
  295.  
  296.  
  297. Checking for the existence of a file                                       267
  298. ====================================
  299.  
  300.  
  301.                 =EXIST (check if specified file exists)
  302.  
  303. flag=EXIST(f$)
  304.  
  305. EXIST checks the current directory for the file f$. If it's found, then
  306. a value -1 will be returned, otherwise 0. This EXIST function is
  307. capable of checking for the existence of anything from a single file to
  308. an entire disc. Example:
  309.  
  310.         Print Exist("DF1:"): Rem Has a second drive been connected?
  311.  
  312.  
  313.  
  314.              =DIR FIRST$ (get first file in the directory
  315.                          satisfying path name)
  316.  
  317. file$=DIR FIRST$(path$)
  318.  
  319. Returns a string containing the name and length of the first file on
  320. the disc which satisfies the current search path$. WHen this function
  321. is called, the entire directory listing will be loaded into memory. You
  322. can now retrieve the name of the next file in the directory using a
  323. call to the DIR NEXT$ function.
  324.  
  325.         Print Dir First$("*.*")
  326.  
  327.  
  328.  
  329.         =DIR NEXT$ (get the next file satisfying current path)
  330.  
  331. file$=DIR NEXT$
  332.  
  333. Returns the next filename in the directory listing created by a
  334. previous DIR FIRST$ command. After the last item has been read from
  335. this list, a string will be returned containing the empty string "".
  336. The entire directory array will now be erased and the memory it
  337. consumes will be released for the rest of your Basic program. Here's an
  338. example which prints out all the files in the current directory:
  339.  
  340.         F$=Dir First$("*.*")
  341.         While F$<>""
  342.           Print F$ : Bell : Wait 30
  343.           F$=Dir Next$
  344.         Wend
  345.  
  346. See EXAMPLE 20.1 in the manual folder.
  347.  
  348.  
  349. Disc files                                                                 268
  350. ==========
  351. Files are just collections of information which have been grouped
  352. together in one place on the disc. Each file is assigned its own name
  353. which may contain anything from 1 to 255 characters.
  354.  
  355.   Before you can use one of these files, you first need to initialize
  356. it using either the OPEN IN, OPEN OUT, or APPEND instructions. When you
  357. open a file, you assign it to a "channel" number ranging from one to
  358. ten. This number will be used in all future disc operations to identify
  359. the file you are currently working with. The commodore Amiga supports
  360. two types of disc files: Sequential files and Random access files.
  361.  
  362.  
  363. Sequential files
  364. ================
  365. Sequential files are the standard files which are used on the Amiga.
  366. The reason for their name is that they only allow you to read your
  367. information in the precise sequence it was originally created. This
  368. means that if you wanted to change just one piece of the data in the
  369. middle of a sequential file, you would have to read in the whole file
  370. up and including this value, and then write the entire file back to the
  371. disc.
  372.  
  373.   AMOS Basic allows you to access sequential files for either writing
  374. or reading, but never for both at the same time.
  375.  
  376.         Open Out1,"file.seq"
  377.         Input "What is your name";N$
  378.         Print #1,N$
  379.         Close 1
  380.  
  381. This creates a file called FILE.SEQ containing your name. In order to
  382. read this information back from the file, type in the lines.
  383.  
  384.         Open In 1,"file.seq"
  385.         Input #1,N$
  386.         Print "I remember your name. It's ";N$
  387.         Close 1
  388.  
  389. Notice how both these programs perform three separate operations:
  390.  
  391.  * Open the file using OPEN IN, OPEN OUT or APPEND
  392.  * Access the file with INPUT# or PRINT#.
  393.  * Close the file with CLOSE. Note that if you forget to do this, any
  394.    changes to the file will be lost!
  395.  
  396. These three steps need to be completed in exactly this order, every
  397. time you access a sequential file.
  398.  
  399.  
  400.  
  401.                    OPEN OUT (open a file for output)                       269
  402.  
  403. OPEN OUT channel,n$
  404.  
  405. Opens a sequential file for writing. If this file already exists it
  406. will be erased. "channel" is a number between 1 and 10 and is used to
  407. identify your new file in your subsequent PRINT# commands. n$ is the
  408. name of the file to be opened.
  409.  
  410.  
  411.  
  412.                   APPEND (add some information to the
  413.                          of an existing file)
  414.  
  415. APPEND channel,name$
  416.  
  417. Opens a sequential file for output. If this file exists, the new data
  418. is added onto the end. This allows you to expand your files at any time
  419. once they've been defined.
  420.  
  421.  
  422.  
  423.                     OPEN IN (open a file for input)
  424.  
  425. OPEN IN channel,f$
  426.  
  427. Sets up a file for reading. If this file doesn't exist, it will be
  428. automatically created. "channel" is a number ranging from 1 to 10 which
  429. is used by various INPUT instructions to refer to your open file.
  430.  
  431.  
  432.  
  433.                          CLOSE (close a file)
  434.  
  435. CLOSE n
  436.  
  437. Closes file number n. WARNING! If you forget to close a file after you
  438. have finished with it, any changes you've made will be ignored!!
  439.  
  440.  
  441.  
  442.                   PRINT # (print a list of variables
  443.                          to a file or device)
  444.  
  445. PRINT #channel,variable list
  446.  
  447. This command is identical to the normal print instruction, but instead
  448. of displaying the information to the screen, it outputs it to a file or
  449. output device specified by the channel number. Here's an example:
  450.  
  451.         Open Out 1,"TestFile"
  452.         Print #,"Hello"
  453.         Close 1
  454.  
  455. As with PRINT you can abbreviate PRINT # to ? #.
  456.  
  457.  
  458.  
  459.                   INPUT # (input a list of variables
  460.                         from a file or device)
  461.  
  462. Reads information from either a sequential file or a device such as the    270
  463. serial port. Like the standard INPUT command, it enters a list of
  464. values and loads them into a set of Basic variables. As always, each
  465. value in the list must be separated by a comma. Additionally, every
  466. line of data also needs to be terminated by its own <line feed>
  467. character. This is equivalent to the Return you pressed when you
  468. entered a line from the keyboard.
  469.  
  470.  
  471.  
  472.                 LINE INPUT # (input a list of variables
  473.                         not separated by a ",")
  474.  
  475. LINE INPUT #channel,variable list
  476. LINE INPUT #channel,separators,variable list
  477.  
  478. This function is identical to INPUT #, except that it allows you to
  479. separate your list of data using any character you with instead of the
  480. standard comma. If the separator is omitted, it's automatically set to
  481. the <return> character. When you're reading text, LINE INPUT # is
  482. always the preferred choice. That's because the commas found in normal
  483. English will be treated as a separator by the INPUT # command. This
  484. will confuse your program completely.
  485.  
  486.  
  487.  
  488.                 SET INPUT (set End Of Line characters)
  489.  
  490. SET INPUT c1,c2
  491.  
  492. Sets the End-Of-Line chars which will be used to terminate a line of
  493. data. The Amiga expects a single <line feed> at the end of each line,
  494. whereas most other computers (including the ST) require both a Return
  495. and <line feed>. SO if you try importing your ST files via the serial
  496. cable, you'll end up with dozens of spurious Return characters in your
  497. files. Fortunately you can  sidestep this problem using SET INPUT.
  498.  
  499.   c1 and c2 hold a pair of ASCII values which will be used for your
  500. separators. If you want to use a single character ,simply load c2 with
  501. a negative value such as minus one. Here's a couple of exmples:
  502.  
  503.         Set Input 10,-1 : Rem Standard Amiga Format
  504.         Set Input 13,10 : Rem ST Format
  505.  
  506.  
  507.  
  508.            =INPUT$ (inputs a number of chars from a device)                271
  509.  
  510. X$=INPUT$ (f,count)
  511.  
  512. Reads "count" characters from device or file number f.
  513.  
  514.  
  515.  
  516.                       =EOF (test for end of file)
  517.  
  518. flag=EOF (channel)
  519.  
  520. EOF is a useful function which tests to see if the end of a file has
  521. been reached at the current reading position. If it has, EOF returns a
  522. result of -1, otherwise 0.
  523.  
  524.  
  525.  
  526.                        LOF (length of open file)
  527.  
  528. length=LOF(channel)
  529.  
  530. Returns the length of an open file. It makes no sense to use this
  531. function in conjunction with devices other than the disc.
  532.  
  533.  
  534.  
  535.                      POF (variable holding current
  536.                        position of file pointer)
  537.  
  538. pos=POF(channel)
  539.  
  540. The POF function changes the current reading or writing position of an
  541. open file, for example:
  542.  
  543.         Pof(1)=1000
  544.  
  545. This sets the read/write position to 1'000 characters past the start of
  546. the file. Oddly enough POF can be used in this way to provide a crude
  547. form of random access when using sequential files! The reason this
  548. works is simply that disc drives are inherently random and all
  549. sequential operations are effectively simulated using random access.
  550.  
  551.  
  552.  
  553. Random access files
  554. ===================
  555. Random access files are so called because you can access the
  556. information stored on the disc in any random order you like. In order
  557. to use these files you first need to understand a little bit of theory.
  558.  
  559.   All random access files are composed of units called records, each
  560. with their own unique number. These records are in turn split up into a
  561. number of separate fields. Every field contains one individual piece of
  562. information. When you use sequential files, these fields can be any
  563. length you with, as the file will only be read in one direction. Random
  564. access files, however, always require you to specify the maximum size
  565. of these fields in advance.
  566.  
  567.   Supposing you wanted to produce a file containing a list of names and
  568. telephone numbers. In this case you could use the fields:
  569.  
  570.         Field           Max length                                         272
  571.         -----           ----------
  572.         SURNAME$             15
  573.         NAME$                15
  574.         CODE$                10
  575.         TEL$                 10
  576.  
  577. You could now define these fields using a line like:
  578.  
  579.         Field #1,15 as SURNAME$,15 as NAME$,10 as CODE$,10 as TEL$
  580.  
  581. It's important to realize that the strings specified by the FIELD
  582. instruction can also be used as normal string variables. This allows
  583. you to read and write information to any particular field. For example:
  584.  
  585.         SURNAME$="HILL"
  586.         TEST$=SURNAME$ : Print TEST$
  587.  
  588. After you've loaded your record with information, you can write it onto
  589. the disc using PUT command. Example:
  590.  
  591.         Put 1,10
  592.  
  593. Loads data into record 10 of the file opened on channel 1
  594.  
  595.   Similarly, you can read a record using the GET instruction:
  596.  
  597.         Get 1,10
  598.  
  599.  
  600.  
  601.              OPEN RANDOM (open a channel to a random file)
  602.  
  603. OPEN RANDOM channel,n$
  604.  
  605. Opens a random access file called n$ on the current disc. When you're
  606. using this instruction, you should always define the record sturcture
  607. immediately afterwards using the FIELD$ command.
  608.  
  609.  
  610.  
  611.                     FIELD (define record structure)
  612.  
  613. FIELD channel,length1 AS field1$,length2 AS field2$......
  614.  
  615. FIELD allows you to define a record which will be used for a random
  616. access file. This record can be up to 65535 bytes in length.
  617.  
  618.         Field 1,15 as SURNAME$,15 as NAME$,10 as CODE$,10 as TEL$
  619.  
  620.  
  621.  
  622.               PUT (output a record to random access file)                  273
  623.  
  624. PUT channel,r
  625.  
  626. PUT moves a record from memory into record number r of a random access
  627. file. Before use, the contents of the new record should first be placed
  628. in the field strings defined by FIELD, using a statement such as:
  629.  
  630.         SURNAME$="HILL"
  631.  
  632. Although you can write existing records in any order you like, you're
  633. not allowed to scatter records on the disc totally at random. This
  634. means that if you have just created a file you can't type in something
  635. like:
  636.  
  637.         Put 1,1
  638.         Put 1,5
  639.  
  640. In this case, the PUT 1,5 instruction will generate an error, as there
  641. are no records in the file with numbers between 2 and 5. Record 2 must
  642. be the next new record in the file, then 3,4... example:
  643.  
  644.         Open Random 1,"TELEPHONE"
  645.         Field 1,30 As NAME$, 30 As Tel$
  646.         INDEX=1
  647.         Do
  648.           Input "Enter a name";NAME$
  649.           Exit If NAME$=""
  650.           Input "Enter telephone number";TEL$
  651.           Put 1,Index : Inc INDEX
  652.         Loop
  653.         Close 1
  654.  
  655.  
  656.  
  657.             GET (input a record from a random access file)
  658.  
  659. GET channel,r
  660.  
  661. Reads record number r stored in a random access file opened using OPEN.
  662. It then loads this record into the field strings created by FIELD. The
  663. strings can now be manipulated in the normal way. Note that you can
  664. only use GET to retrieve records which are actually on the disc. If you
  665. try to grab a record number which does not exist then an error will be
  666. generated. Example:
  667.  
  668.         Open Random 1,"TELEPHONE"
  669.         Field 1,30 As NAME$, 30 As TEL$
  670.         Do
  671.           Input "Enter Record number";INDEX
  672.           Exit If Index=0
  673.           Get 1,INDEX : Print NAME$ : Print TEL$
  674.         Loop
  675.         Close 1
  676.  
  677.  
  678. The Printer                                                                274
  679. ===========
  680.  
  681.  
  682.                     LLIST (print a part or all of a
  683.                          program on a printer)
  684.  
  685. LLIST
  686.  
  687. Lists the entire program straight to the printer. Try listing some of
  688. the Basic programs supplied on the DATA disc. These provide a perfect
  689. demonstration of the various programming tehcniques neeked to write
  690. your own AMOS Basic games. Feel free to modify them as much as you
  691. like.
  692.  
  693.  
  694.  
  695.                        LPRINT (output a list of
  696.                        variables to the printer)
  697.  
  698. LPRINT variable list
  699.  
  700. This is exactly the same as PRINT but sends your data to the printer
  701. instead of the screen. Example:
  702.  
  703.         Lprint "Hello"
  704.  
  705. See PRINT, USING, PRINT #
  706.  
  707.  
  708.  
  709.                 LDIR (list a directory to the printer)
  710.  
  711. LDIR [PATH$] [W/]
  712.  
  713. Lists the directory of the current disc to the printer. See DIR for
  714. more details.
  715.  
  716.  
  717. External devices
  718. ================
  719.  
  720.  
  721.                OPEN PORT (open a channel to an I/O port)
  722.  
  723. OPEN PORT channel,"PAR:"  (open a channel to the Paraller interface)
  724. OPEN PORT channel,"SER:"  (open a channel to the RS232 port)
  725. OPEN PORT channel,"PRT:"  (open a channel for the printer)
  726.  
  727. OPEN PORT allows you to communicate with external devices such as the
  728. RS232 port. All the standard file commands can be performed as normal,
  729. except for commands like LOF or POF which are obviously only relevant
  730. to disc operations. Example:
  731.  
  732.         Open Port 1,"SER:"                                                 275
  733.         For X=0 To 10
  734.           Print #1,"AMOS BASIC"
  735.         Next X
  736.         Close 1
  737.  
  738. This program prints out ten lines of text on the device connected to
  739. the RS232 port. If your printer uses the paraller port change line 10
  740. to:
  741.  
  742.         Open Port 1,"PRT:"
  743.  
  744. Similarly you can input information from a device such as a modem with
  745. a line like:
  746.  
  747.         Input #1,A$ : Print A$
  748.  
  749. When accessing these external devices all the normal input statements
  750. are available for your use, including INPUT$ and LINE INPUT.
  751.  
  752.  
  753.  
  754.             =PORT (function to test if channel is waiting)
  755.  
  756. n=PORT(channel)
  757.  
  758. Tests to see if an input device is ready to send you some information.
  759. If the device is waiting for you to read it, a value of -1 will be
  760. returned by this function, otherwise 0 (false).
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  
  769.                          21: SCREEN COMPACTION                             276
  770.                       ---------------------------
  771.  
  772.  
  773.                        SPACK (screen compaction)
  774.  
  775. SPACK s TO n [tx,ty,bx,by]
  776.  
  777. The SPACK command packs screen s into memory bank n. Everything about
  778. the current image is saved, including its mode, screen size, offset and
  779. display position. This allows you to recreate your screen in exactly
  780. its original state.
  781.  
  782.   s is the number of the screen which contains yur image. n holds the
  783. number of a memory bank from 1-16. If this bank doesn't currently
  784. exist, it will be reserved for you automatically. Your new bank will be
  785. stored in FAST memory if it's available, and will be saved along with
  786. our Basic program. After you've called this function, the size of your
  787. screen can be found using LENGTH. Example:
  788.  
  789.         F$=FSEL$("*","","Load a picture")
  790.         Load Iff F$,0
  791.         Spack 0 To 1
  792.         Print "The length of your new bank is ";Length(1);" Bytes"
  793.         Wait Key
  794.         Screen Close 0
  795.         UnPack 1 To 0 : Rem recreate compacted screen
  796.  
  797. You don't, of course have to compact an entire screen with this
  798. instruction. The optional parameters let you compress any rectangular
  799. section of the display you like. 
  800.  
  801.   tx,ty now hold the coordinates of the top left corner of this region.
  802. bx,by set the position of the bottom right corner. All x coordinates
  803. are rounded to the nearest 8 pixel boundary.
  804.  
  805.   Note that in order to achieve the maximum memory reduction, SPACK
  806. will attempt to compact your image using several different strategies.
  807. It will then compress your image using the method which consumes the
  808. least amount of memory. One side effect of this efficiency, is that it
  809. usually takes around 6 secs to compress one of your images. This is        277
  810. hardly a disadvantage however, as normally the compaction is only
  811. required when you are writing your programs.
  812.  
  813.   Since each image can be unpacked on the screen in less than a second,
  814. there's no risk of interference with the speed of your games. It speeds
  815. is of the essence though, you may wish to use the CBLOCK system
  816. instead. See the section on Background Graphics for more details. 
  817.  
  818.   Incidentally, if you compare the compacted size of your files with
  819. their original length on the disc, you may be mislead into
  820. underestimating the size of the memory reduction. It's important to
  821. realize that the vast majority of these files have ALREADY BEEN
  822. COMPESSED using the standard IFF compaction routines. So it's rather
  823. surprising that AMOS can reduce them by a further 20 % !
  824.  
  825.   Compacted screens are perfect for the titles and hi-score tables
  826. required in an arcade game, as they allow you to introduce snazzy
  827. screen effects without consuming enormous quantities of memory. They
  828. can also be incorporated directly into RPGs and Adventures.
  829.  
  830.  
  831.  
  832.                          PACK (pack a screen)
  833.  
  834. PACK s TO n [tx,ty,bx,by]
  835.  
  836. Compresses screen s into bank number n. Unlike the previous SPACK
  837. command, only the image data is compressed. So your compacted screen
  838. must always be unpacked directly into an existing screen.
  839.  
  840.   Because of the way images are decompressed, there will be a
  841. noticeable shimmer effect unless you've previously double buffered your
  842. screens. Try to avoid using PACK with single buffered screens. It's
  843. much more sensible to call the SPACK system for this purpose.
  844.  
  845.   If the optional coordinates are included, only a section of the image
  846. will be compressed.
  847.  
  848.   Since PACK is fully compatible with the standard AUTOBACK system,
  849. it's easy to combine compacted images with moving screens. If you are
  850. using Autoback 2  mode, you'll even be able to unpack your images
  851. BEHIND existing bobs. It's therefore possible to exploit this
  852. instruction in conjunction with SCREEN OFFSET to create fantastic
  853. scrolling backgrounds for your games.
  854.  
  855.  
  856.  
  857.                   UNPACK (unpack a compacted screen)
  858.  
  859. Decompresses a screen which has been previously compacted using the
  860. SPACK or PACK instructions. Each compaction routine has its own
  861. specifix form of the UNPACK command.
  862.  
  863.  SPACK
  864.  -----
  865.  
  866. UNPACK b TO s
  867.  
  868. Opens a screen s and restores the compacted screen into bank b. If this
  869. screen already exists, it will completely replaced by the new image.
  870. Once the screen has been unpacked, it will be neatly flicked into view.    278
  871.  
  872.  PACK
  873.  ----
  874.  
  875. PACKed screens can be unpacked using two separate instructions. These
  876. take an image from a memory bank, and load it straight into an existing
  877. screen. WARNING! The destination screen MUST be in exactly the same
  878. format as your compacted picture, otherwise you'll get an
  879. "illegal function call" error.
  880.  
  881.   When you unpack your screens, you may notice that the effect is
  882. slightly messy. That's 'cause the PACK command is only really intended
  883. for use with the double buffering system. Providing your screen is
  884. double buffered, you'll get a delightfully smooth result.
  885.  
  886. UNPACK b
  887.  
  888. Unpacks the screen at its original position
  889.  
  890. UNPACK b,x,y
  891.  
  892. Redraws your image starting at coordinates x,y. If the new image
  893. doesnt' fit into the current screen, you'll get an error message.
  894.  
  895.  
  896.  
  897.  
  898.  
  899.  
  900.  
  901.  
  902.  
  903.                            22: MACHINE CODE                                279
  904.                       ---------------------------
  905.  
  906. Number conversion
  907. -----------------
  908.  
  909.                      =HEX$ (convert number to hexadecimal)
  910.  
  911. h$=HEX$(v)
  912. h$=HEX$(v,n)
  913.  
  914. HEX$ converts the integer v into hexadecimal notation (base 16). It
  915. returns a sequence of n hexadecimal characters in the string h$. Example:
  916.  
  917.         Print Hex$(Colour(1),3)
  918.  
  919.  
  920.  
  921.                     =BIN$ (convert number to binary string) 
  922.  
  923. b$=BIN$(v)
  924. b$=BIN$(v,n)
  925.  
  926. Converts a number into binary notation (base 2).
  927.  
  928.  
  929. Memory manipulation
  930. -------------------
  931.  
  932.  
  933.                             =PEEK (get byte address)
  934.  
  935. v=PEEK(address)
  936.  
  937. Returns the 8-bit byte stored at "address"
  938.  
  939.  
  940.  
  941.                          POKE (change byte at address)                     280
  942.  
  943. POKE address,v
  944.  
  945. Copies the number v into "address". v must always lie in the range 0-255.
  946. Be warned: POKE can be very dangeroud. If you poke around
  947. indiscriminately, you will almost certainly crash the Amiga!
  948.  
  949.  
  950.  
  951.                           =DEEK (get word at address)
  952.  
  953. v=DEEK(address)
  954.  
  955. Reads the two-byte word found at "address". "address" MUST be even or 
  956. an address error will occur.
  957.  
  958.  
  959.  
  960.                          DOKE (change word at address)
  961.  
  962. DOKE address,value
  963.  
  964. DOKE loads a two-byte number between 0 and 65535 into the memory location
  965. at "address". In knowledgeable hands this function caan be very useful.
  966. Since even the best of us make mistakes however, you should always save
  967. a copy ot your progs to the disc before attempting to use this function
  968. in a new routine. Example:
  969.  
  970.         Doke Phybase(1)+1000,65535
  971.  
  972.  
  973.  
  974.                       =LEEK (read a long word at address)
  975.  
  976. v=LEEK(address)
  977.  
  978. Returns the four-byte long word stored at "address". Like DEEK, the
  979. address used with this function must always be EVEN. If bit 31 of
  980. the return value is set to 1, v will be diplsyed as a negative
  981. number. This isn't a bug. It's just a side effect of the way AMOS
  982. deals with numbers.
  983.  
  984.  
  985.  
  986.                        LOKE (change long word at address)                  281
  987.  
  988.  
  989. LOKE address,n
  990.  
  991. LOKE copies the four-byte number into "address". Example:
  992.  
  993.         Loke Phybase(1)+10000,$FFFFFFFF
  994.  
  995. Indiscriminate use of this function can lead to the Amiga crashing
  996. horribly, so take care.
  997.  
  998.  
  999.  
  1000.                       =VARPTR (get address of a variable)
  1001.  
  1002. address=VARPTR(variable)
  1003.  
  1004. Returns the address in memory of a Basic variable. Each type of variable
  1005. is stored using its own individual format:
  1006.  
  1007. Integers: VARPTR finds the address of the four bytes containing the
  1008. contents of your variable.
  1009.  
  1010. Floating points: VARPTR returns the location of four bytes which hold
  1011. the value of the variable in the IEEE single precision format
  1012.  
  1013. Strings: The VARPRT address points to the first character of the string.
  1014. Since AMOS Basic doesn't end its strings with a CHR$(0), you must
  1015. obtain the length of the string using something like:
  1016.  
  1017. DEEK(VARPTR(A$)-2), where A$ is the name of your variable. You could
  1018. also use LEN(A$) of couse.
  1019.  
  1020.  
  1021.  
  1022.                            COPY (copy a memory block)
  1023.  
  1024. COPY start,finish TO destination
  1025.  
  1026. This command is used to rapidly move large sections of the Amiga's 
  1027. memory from one place to another. "start" and "finish" are the
  1028. addresses of the first and last bytes of your data respectively.
  1029.  
  1030.   "destination" points to a memory area which will be loaded with
  1031. your new data. All these addresses MUST be even, or you'll get an 
  1032. address error.
  1033.  
  1034.  
  1035.  
  1036.                     FILL (fill memory block with a longword)               282
  1037.  
  1038. FILL start TO finish, pattern
  1039.  
  1040. Fills a selected region of memory with the four bytes held in 
  1041. "pattern". "start" and "finish" determine the position and size of
  1042. the block which is to be filled. These addresses MUST BE EVEN!
  1043.  
  1044.   "pattern" is a long word containg a four byte fill pettern. This
  1045. will be copied into each group of memory locations between 
  1046. "start" and "finish".
  1047.  
  1048.  
  1049.  
  1050.                         =HUNT (find a string in memory)
  1051.  
  1052. f=HUNT(start TO finish, s$)
  1053.  
  1054. Searches through the Amiga's memory for the sequence of characters held
  1055. in s$. "start" is the address of the first byte in memory to be searched,
  1056. and "finish" is the address of the last. On completion, f will hold
  1057. either 0 (in the string in a$ was not found) or the location of f$.
  1058.  
  1059.  
  1060.  
  1061. Bitwise operations
  1062. ------------------
  1063.  
  1064.  
  1065.                                ROL (rotate left)
  1066.  
  1067. ROL.B n,v
  1068. ROL.W n,v
  1069. ROL.L n,v
  1070.  
  1071. ROL is a Basic version of the ROL instruction found in 68000 assembly
  1072. language. The effect is to take the binary representation of a number
  1073. in v, and rotate it left by exactly n places.
  1074.  
  1075.   If v is a single variable, then the number to be rotated is taken
  1076. directly from v. But if v is an expression, then it's treated as the
  1077. address of your number instead. Example:
  1078.  
  1079.         A=8
  1080.         Ror 1,A
  1081.         Print A
  1082. ( result: 4 )
  1083.  
  1084. ROR is capable of dividing any positive value by a power of two. The
  1085. resulting calculation will be performed much faster than the equivalent
  1086. "/" operation.
  1087.  
  1088.  
  1089.  
  1090.  
  1091.                                ROR (rotate right)                          283
  1092.  
  1093. This is very similar to ROL but rotates the number in the opposite
  1094. direction.
  1095.  
  1096.  
  1097.  
  1098.                                =BTST (test a bit)                          284
  1099.  
  1100. Tests the binary digit at position n in the variable v. If v is an 
  1101. expression, it will be used as the address of the bit which is to 
  1102. be checked. In this case n will be automatically ANDed with 7
  1103. before proceeding.
  1104.  
  1105.   After BTST has been called, b will be loaded with -1 if the bit
  1106. at position n is set to 1, otherwise it will be 0.
  1107.  
  1108.  
  1109.  
  1110.                              BSET (set a bit to 1)
  1111.  
  1112. BSET n,v
  1113.  
  1114. Sets the bit at position n to 1 in the variable v.
  1115.  
  1116.  
  1117.  
  1118.                               BCHG (change a bit)
  1119.  
  1120. BCHG n,v
  1121.  
  1122. Changes bit number n in the variable v. If this bit is currently 1
  1123. then the new value will be a zero, and vice versa.
  1124.  
  1125.  
  1126.  
  1127.                                BCLR (clear a bit)                          285
  1128.  
  1129. BCLR n,v
  1130.  
  1131. Clears bit number n in variable v by setting it to zero. Like all 
  1132. the bitwise operations, if v is an expression, then it will be used
  1133. as the location of your data in memory.
  1134.  
  1135.  
  1136.  
  1137. Using assembly language
  1138. -----------------------
  1139. AMOS Basic includes special facilities which allow you to combine
  1140. assembly language routines with your Basic programs. It's worth
  1141. emphasising that, because of the sheer power of the AMOS system,
  1142. machine code is only rarely useful. We've added these features solely
  1143. for existing assembly language programmers who may wish to optimize
  1144. their Basic programs with the occasional bit of machine code.
  1145.  
  1146.  
  1147.  
  1148.                    PLOAD (reserve a memory bank for
  1149.                           some machine code)
  1150.  
  1151. PLOAD "filename",bank
  1152.  
  1153. Reserves a memory bank and loads it with a machine-code program from
  1154. the disc. "bank" is the number of a memory bank which is to be reserved
  1155. for your program. If it's negative, then the bank will be calculated
  1156. using the absolute value of this number, and the required memory area
  1157. will be allocated from CHIP mem.
  1158.  
  1159.   Once you've loaded a program in this way, you can save it on the disc
  1160. as an normal ".ABK" file. Since the banks created by this function are
  1161. permanent, it will also be saved directly with your AMOS programs.
  1162.  
  1163.   Your program must consist of a machine code file in the standard
  1164. Amiga format. In practice, it can contain practically anything you
  1165. like, with the following restrictions:
  1166.  
  1167.  * The code MUST be totally relocatable.
  1168.  * Only the CODE chunck of your program will be loaded
  1169.  * The program must be terminated by a single RTS instruction
  1170.  
  1171.  
  1172.  
  1173.                   CALL (call a machine-code program)
  1174.  
  1175. CALL address[,params]
  1176. CALL bank[,params]
  1177.  
  1178. Executes an assembly language program held in the AMiga's memory.
  1179.  
  1180.   "addrss" can be either the absolute location of your code, or the
  1181. number of an AMOS memory bank which has been previously created with
  1182. PLOAD. 
  1183.  
  1184.   On entry to your program, registers D0 to D7 and A0 to A2 will be
  1185. loaded from the values stored in the DREG and AREG arrays. Your
  1186. assembly language program can now change any 68000 register it likes.
  1187. At the start the routine, register A3 will point to the optional
  1188. parameter list, and A5 will contain the address of the main AMOS data
  1189. area. When your program's finished, you can return to Basic with just a
  1190. simple RTS instruction.
  1191.  
  1192.   "params" is a list of parameters which will be pushed onto the A3
  1193. stack by the CALL command. These parameters need to be removed in
  1194. REVERSE order. So the last value you entered into the instruction wlil
  1195. be the first on to the stack. Depending on the type of your parameters,
  1196. the values referenced by A3 will be in one of the following three
  1197. formats:
  1198.  
  1199. Integer : Holds a long word containing a normal AMOS integer.
  1200.  
  1201. F.Point : Contains a floating point number in IEEE single prec. format.
  1202.  
  1203. String  : Sotres the address of the string. All strings start with a 
  1204.           single word containing their length.
  1205.  
  1206. WARNING! Never poke directly into a string! When a string is
  1207. initialised to a constant the string address will point to the original
  1208. assignment statement inside the current program listing! So if you
  1209. change this value, you'll affect your original source code. This is
  1210. obviously extremely unwise, and should be avoided. See EXAMPLE 21.1
  1211.  
  1212.  
  1213.  
  1214.                =AREG= (variable used to pass information                   286
  1215.                    to the 68000's address registers)
  1216.  
  1217. a=AREG(r)
  1218. AREG(r)=a
  1219.  
  1220. AREG is an array of six PSEUDO variables which are used to hold a copy
  1221. of the first six of the 68000's address registers. r can range from 0
  1222. to 6 and indicates the number of the address register which is to be
  1223. affected.
  1224.  
  1225.   Whenever the CALL command is executed, the contents of this array are
  1226. loaded automatically into address registers A0 to A2. At the end of the
  1227. function, they are then saved back with any new information which has
  1228. been placed in the appropriate registers.
  1229.  
  1230.  
  1231.  
  1232.                =DREG= (variable used to pass information
  1233.                     to the 68000's data registers)
  1234.  
  1235. d=DREG(r)
  1236. DREG(r)=d
  1237.  
  1238. This is an array of eight integers wihch holds a copy of the contents
  1239. of the 68000 data registers. r refers to the register number and can
  1240. range from 0 to 7 for D1 to D7 respectively.
  1241.  
  1242.  
  1243. Accessing the system libraries                                             287
  1244. ==============================
  1245. AMOS also allows you to call up most of the Amiga's internal system
  1246. libraries directly from the ROM. These aren't particularly useful,
  1247. since all the really interesting calls have already been built into
  1248. AMOS!
  1249.  
  1250.   Don't use these routines unless you know precisely what you're doing.
  1251. The Amiga is notoriously difficult to program, and it's all to easy to
  1252. crash the system and generate the infamous GURU error by mistake.
  1253.  
  1254.  
  1255.  
  1256.                         =DOSCALL (DOS library)
  1257.  
  1258. r=DOSCALL(function)
  1259.  
  1260. Executes a function directly from the DOS library. "function" is the
  1261. offset to the appropriate function. See the Amiga ROM Kernel Manuals
  1262. for more details.
  1263.  
  1264.   Before using this function, you'll need to set some of the control
  1265. registers in D0 to D7 and A0 to A2 using the AREG and DREG functions.
  1266. WHen the routine exits back to Basic, the contents of D0 are returned
  1267. in r. Note: The return values will not be loaded into DREG and AREG.
  1268.  
  1269.  
  1270.  
  1271.                         =EXECALL (EXEC library)
  1272.  
  1273. r=EXECALL(function)
  1274.  
  1275. Performs a call to the Amiga's EXEC library. On entry, D0 to D7 and
  1276. A0 to A2 are loaded with the control settings from the DREG and AREG
  1277. arrays. r is returned holding the contents of D0.
  1278.  
  1279.  
  1280.  
  1281.                       =GFXCALL (Graphics library)
  1282.  
  1283. r=GFXCALL(function)
  1284.  
  1285. Calls a routine from the graphics library using the control values
  1286. stored in the DREG and AREG arrays.
  1287.  
  1288.  
  1289.  
  1290.                      =INTCALL (Intuition library)
  1291.  
  1292. r=INTCALL(function)
  1293.  
  1294. Executes a command from the Intuition library. As usual the control
  1295. values are loaded from DREG and AREG arrays, and r holds the result of
  1296. the call. 
  1297.  
  1298.   Since AMOS doesn't use the standard intuition routine, this function
  1299. is especially dangerous. Only call it if you are already familiar with
  1300. the Amiga's intuition library.
  1301.  
  1302.  
  1303. Inside AMOS Basic                                                          288
  1304. =================
  1305. In order to provide full access to the inner workings of the AMOS
  1306. system for developers, we've included several "hooks" into the various
  1307. data areas. These are not intended for the casual programmer, but they
  1308. do enable adbanved users to create their own AMOS utilities.
  1309.  
  1310.  
  1311.  
  1312.                     =SCREEN BASE (get screen table)
  1313.  
  1314.  
  1315. table=SCREEN BASE
  1316.  
  1317. Returns the base address of the internal table used to hold the number
  1318. and position of your AMOS screens. See EXAMPLE 21.2
  1319.  
  1320.  
  1321.  
  1322.                     =SPRITE BASE (get sprite table)
  1323.  
  1324. table=SPRITE BASE(n)
  1325.  
  1326. Provides the address of the internal data list for sprite n. If this
  1327. sprite doesn't exist, then the address of the table will be zero.
  1328.  
  1329.   Negative values for n return the address of the optional MASK
  1330. associated with your sprite. "table" will now contain one of three
  1331. possible values, depending on the status of this mask:
  1332.  
  1333. table < 0   Indicates that there's no mask for this sprite at all
  1334. table = 0   Sprite n does have a mask, but it hasn't been generated
  1335. table > 0   This is the address of the Mask in memory. The first
  1336.             long word of this area holds the length of the mask, and
  1337.             the next is followed by the actual definition.
  1338.  
  1339. See EXAMPLE 21.3
  1340.  
  1341.  
  1342.  
  1343.                        =ICON BSE (get icon base)
  1344.  
  1345. table=ICON BASE(n)
  1346.  
  1347. Returns the address for icon n. The format of this information is
  1348. exactly the same as the previous SPRITE BASE function.
  1349.  
  1350.  
  1351.  
  1352.  
  1353.  
  1354.  
  1355.  
  1356.  
  1357.  
  1358.                            23: COMMAND INDEX                               289
  1359.                       ---------------------------
  1360.  
  1361. ABS ..................125       ACOS .................112
  1362. ADD .................. 39       AMAL .................186
  1363. AMAL FREEZE ..........193       AMAL ON/OFF ..........193
  1364. AMALERR ..............195       AMPLAY ...............193
  1365. AMREG ................193       ANIM .................205
  1366. ANIM FREEZE ..........206       ANIM ON/OFF ..........206
  1367. APPEAR ...............136       APPEND ...............269
  1368. AREG .................286       ASC .................. 58
  1369. AT ................... 91       ATAN .................113
  1370. AUTO VIEW ON/OFF .....121       AUTOBACK .............158
  1371. BANK TO MENU .........221       BAR .................. 68
  1372. BCHG .................284       BCLR .................285
  1373. BELL .................234       BGRAB ................ 31
  1374. BIN$ .................279       BLOAD ................ 51
  1375. BOB ..................155       BOB CLEAR ............161
  1376. BOB COL ..............170       BOB DRAW .............161
  1377. BOB OFF ..............163       BOB UPDATE ...........161
  1378. BOBSPRITE COL ........170       BOOM .................233
  1379. BORDER ...............101       BORDER$ .............. 98
  1380. BOX .................. 65       BREAK ON/OFF ......... 83
  1381. BSAVE ................ 51       BSET .................284
  1382. BTST .................284       CALL .................285 
  1383. CDOWN ................ 93       CDOWN$ ............... 93
  1384. CENTRE ............... 96       CHANAN ...............195
  1385. CHANGE MOUSE .........165       CHANMV ...............195
  1386. CHANNEL ..............197       CHOICE ...........214,216
  1387. CHR$ ................. 58       CIRCLE ............... 66
  1388. CLEAR KEY ............251       CLEFT ................ 94
  1389. CLEFT$ ............... 94       CLINE ................ 96
  1390. CLIP ................. 71       CLOSE ................269
  1391. CLOSE EDITOR ......... 30       CLOSE WORKBENCH ...... 30
  1392. CLS ..................131       CLW ..................103
  1393. CMOVE ................ 90       COL ..................170
  1394. COLOUR ............... 62       COP LOGIC ............144
  1395. COP MOVE .............143       COP MOVEL ............143
  1396. COP RESET ............144       COP WAIT .............143
  1397. COPPER OFF ...........143       COPPER ON ............143
  1398. COPY .................281       COS ..................112
  1399. CRIGHT ............... 94       CRIGHT$ .............. 94
  1400. CUP .................. 93       CUP$ ................. 93
  1401. CURS ON/OFF .......... 95       CURS PEN ............. 96
  1402. DATA .................256       DEC .................. 39
  1403. DEEK .................280       DEF FN ...............118                  290
  1404. DEF SCROLL ...........133       DEFAULT ..............121
  1405. DEFAULT PALETTE ......131       DEGREE ...............111
  1406. DEL BLOCK ............210       DEL CBLOCK ...........211
  1407. DEL ICON .............209       DEL WAVE .............244
  1408. DFREE ................265       DIM .................. 36
  1409. DIR ..................262       DIR FIRST$ ...........267
  1410. DIR NEXT$ ............267       DIR$ .................263
  1411. DIRECT ............... 80       DO...LOOP ............ 79
  1412. DOKE .................280       DOSCALL ..............287
  1413. DOUBLE BUFFER ........156       DRAW ................. 65
  1414. DREG .................286       DUAL PLAYFIELD .......127
  1415. DUAL PRIORITY ........128       EDIT ................. 80
  1416. ELLIPSE .............. 66       END .................. 81
  1417. EOF ..................271       ERASE ................ 50
  1418. ERRN ................. 86       ERROR ................ 86
  1419. EVERY n GOSUB ........ 82       EVERY n PROC ......... 82
  1420. EVERY ON/OFF ......... 82       EXECALL ..............287
  1421. EXIST ................267       EXIT ................. 79
  1422. EXIT IF .............. 80       EXP ..................114
  1423. FADE .................137       FALSE ................259
  1424. FIELD ................272       FILL .................383
  1425. FIRE .................169       FIX ..................117
  1426. FLASH ................138       FLIP$ ................ 57
  1427. FN ...................118       FONT$ ................107
  1428. FOR...NEXT ........... 77       FREE ................. 53
  1429. FSEL$ ................266       GET ..................273
  1430. GET BLOCK ............209       GET BOB ..............163
  1431. GET CBLOCK ...........211       GET DISC FONTS .......107
  1432. GET FONTS ............106       GET ICON .............208
  1433. GET ICON PALETTE .....208       GET PALETTE ..........131
  1434. GET ROM FONTS ........107       GET SPRITE ...........107
  1435. GET SPRITE PALETTE ...151       GFXCALL ..............151
  1436. GLOBAL ............... 46       GOSUB ................ 46
  1437. GOTO ................. 74       GR LOCATE ............ 73
  1438. GR WRITING ........... 70       HCOS ................. 70
  1439. HEX$ .................279       HIDE .................279
  1440. HOME ................. 92       HOT SPOT ............. 92
  1441. SCROLL ............... 98       HSIN ................. 98
  1442. HSLIDER ..............104       HTAN .................104
  1443. HUNT .................282       HZONE ................173
  1444. I BOB ................162       I SPRITE .............154
  1445. ICON BASE ............154       IF..THEN..[ELSE] ..... 75
  1446. IF..[ELSE]..ENDIF .... 76       INC .................. 39
  1447. INK .................. 61       INKEY$ ...............249
  1448. INPUT ................252       INPUT # ..............269
  1449. INPUT$ ...............271       INPUT$() .............250
  1450. INSTR ................ 56       INT ..................115
  1451. INTCALL ..............287       INVERSE ON/OFF ....... 88                  291
  1452. JDOWN ................169       JLEFT ................168
  1453. JOY ..................168       JRIGHT ...............168
  1454. JUP ..................168       KEY SHIFT ............250
  1455. KEY SPEED ............251       KEY STATE ............250
  1456. KILL .................265       LDIR .................274
  1457. LED ..................248       LEEK .................280
  1458. LEFT$ ................ 58       LEN .................. 58
  1459. LENGTH ............... 50       LIMIT BOB ............162
  1460. LIMIT MOUSE ..........167       LINE INPUT ...........253 
  1461. LINE INPUT # .........253       LIST BANK ............ 49
  1462. LLIST ................274       LN ...................114
  1463. LOAD ................. 51       LOAD IFF .............124
  1464. LOCATE ............... 90       LOF ..................271
  1465. LOG ..................114       LOGBASE ..............136
  1466. LOGIC ................136       LOKE .................281
  1467. LOWER$ ............... 57       LPRINT ...............274
  1468. MAKE ICON MASK .......209       MAKE MASK ............172
  1469. MATCH ................ 60       MAX ..................116
  1470. MEMORIZE X/Y ......... 95       MENU$ ............212,215
  1471. MENU ACTIVE ..........229       MENU BAR .............228
  1472. MENU BASE ............231       MENU CALC ............222
  1473. MENU CALLED ..........226       MENU DEL .............221
  1474. MENU INACTIVE ........229       MENU ITEM MOVABLE ....230
  1475. MENU ITEM STATIC .....230       MENU KEY .............219
  1476. MENU LINE ............227       MENU LINKED ..........231
  1477. MENU MOUSE ...........232       MENU MOVABLE .........229
  1478. MENU ON/OFF ..213,220,221       MENU ONCE ............227
  1479. MENU SEPARATE ........231       MENU STATIC ..........230
  1480. MENU TLINE ...........228       MENU TO BANK .........221
  1481. MENU X ...............231       MENU Y ...............231
  1482. MID$ ................. 54       MIN ..................117
  1483. MKDIR ................265       MOUSE CLICK ..........166
  1484. MOUSE KEY ............166       MOUSE ZONE ...........173
  1485. MOVE FREEZE ..........205       MOVE ON/OFF ..........205
  1486. MOVE X ...............203       MOVE Y ...............204
  1487. MOVON ................205       MUSIC ................238
  1488. MUSIC OFF ............238       MUSIC STOP ...........238
  1489. MVOLUME ..............239       NO MASK ..............158
  1490. NOISE ................244       NOT ..................258
  1491. ON ERROR GOTO ........ 83       ON ERROR PROC ........ 84
  1492. ON MENU DEL ..........218       ON MENU GOSUB ........218
  1493. ON MENU GOTO .........218       ON MENU ON/OFF .......218
  1494. ON MENU PROC ......... 81       ON...GOSUB ........... 81
  1495. ON...GOTO ............ 81       ON...PROC ............ 81
  1496. OPEN IN ..............269       OPEN OUT .............269
  1497. OPEN PORT ............274       OPEN RANDOM ..........272
  1498. PACK .................277       PAINT ................ 67
  1499. PALETTE .............. 63       PAPER ................ 87
  1500. PAPER$ ............... 88       PARAM ................ 46
  1501. PARENT ...............264       PASTE BOB ............163
  1502. PASTE ICON ...........207       PEEK .................279
  1503. PEN .................. 87       PEN$ ................. 87
  1504. PHYBASE ..............135       PHYSIC ...............135
  1505. PI# ..................240       PLAY .................240
  1506. PLOAD ................285       PLOT ................. 64
  1507. POF ..................271       POINT ................ 64
  1508. POKE .................280       POLYGON .............. 68
  1509. POLYLINE ............. 65       POP .................. 75
  1510. POP PROC ............. 47       PORT .................275
  1511. PRG FIRST$ ........... 31       PRG NEXT$ ............ 31
  1512. PRINT # ..............269       PRINT / ? ............254
  1513. PRIORITY ON/OFF ......174       PROCEDURE ............ 42
  1514. PRUN ................. 31       PSEL$ ................ 32
  1515. PUT ..................273       PUT BLOCK ............210
  1516. PUT BOB ..............163       PUT CBLOCK ...........211
  1517. PUT KEY ..............252       RADIAN ...............111
  1518. RAIN .................141       RAINBOW ..............141
  1519. RANDOMIZE ............116       READ .................256
  1520. REM / ' ..............255       REMEMBER X/Y ......... 96
  1521. RENAME ...............265       REPEAT$ .............. 97
  1522. REPEAT...UNTIL ....... 78       RESERVE .............. 49
  1523. RESERVE ZONE .........172       RESET ZONE ...........174
  1524. RESTORE ..............257       RESUME ............... 85                  292
  1525. RETURN ............... 74       RIGHT$ ............... 54
  1526. RND ..................115       ROL ..................282
  1527. ROR ..................283       RUN ..................266
  1528. SAM BANK .............236       SAM LOOP .............237
  1529. SAM PLAY .............235       SAM RAW ..............236
  1530. SAMPLE ...............244       SAVE ................. 51
  1531. SAVE IFF .............124       SAY ..................247
  1532. SCAN$ ................ 29       SCANCODE .............249
  1533. SCIN .................130       SCREEN ...............129
  1534. SCREEN BASE ..........288       SCREEN CLONE .........127
  1535. SCREEN CLOSE .........121       SCREEN COLOUR ........130
  1536. SCREEN COPY ..........132       SCREEN DISPLAY .......125
  1537. SCREEN HEIGHT ........130       SCREEN HIDE ..........129
  1538. SCREEN OFFSET ........126       SCREEN OPEN ..........119
  1539. SCREEN SHOW ..........130       SCREEN SWAP ..........134
  1540. SCREEN TO BACK .......129       SCREEN TO FRONT ......129
  1541. SCREEN WIDTH .........130       SCROLL ...............134
  1542. SET BOB ..............157       SET BUFFER ........... 53
  1543. SET CURS ............. 95       SET DIR ..............264
  1544. SET ENVEL ............245       SET FONT .............108
  1545. SET INPUT ............270       STE LINE ............. 67
  1546. SET MENU .............232       SET PAINT ............ 70
  1547. SET PATTERN .......... 69       SET RAINBOW ..........139
  1548. SET SLIDER ...........104       SET SPRITE BUFFER ....151                  293
  1549. SET TAB .............. 97       SET TALK .............247
  1550. SET TEMPRAS .......... 71       SET TEXT .............108
  1551. SET WAVE .............241       SET ZONE .............172
  1552. SGN ..................115       SHADE ON/OFF ......... 88
  1553. SHARED ............... 45       SHIFT DOWN ...........139
  1554. SHIFT OFF ............139       SHIFT UP .............138
  1555. SHOOT ................233       SHOW .................165
  1556. SIN ..................111       SORT ................. 59
  1557. SPACE$ ............... 57       SPACK ................276
  1558. SPRITE ...............145       SPRITE BASE ..........288
  1559. SPRITE COL ...........169       SPRITE OFF ...........152
  1560. SPRITEBOB COL ........170       SPRITE UPDATE ........152
  1561. SQR ..................114       START ................ 50
  1562. STR$ ................. 59       STRING$ .............. 58
  1563. SWAP .................117       SYNCHRO ..............202
  1564. TAB$ ................. 97       TAN ..................112
  1565. TEMPO ................239       TEXT .................106
  1566. TEXT BASE ............109       TEXT LENGTH ..........109
  1567. TEXT STYLE ...........109       TIMER ................258
  1568. TITLE BOTTOM .........101       TITLE TOP ............101
  1569. TRUE .................258       UNDER ON/OFF ......... 89
  1570. UNPACK ...............277       UPDATE ...............175
  1571. UPDATE EVERY .........201       UPPER$ ............... 57
  1572. USING ................254       VAL .................. 59
  1573. VARPTR ...............281       VIEW .................121
  1574. VOICE ................239       VOLUME ...............235
  1575. VSCROLL .............. 99       VSLIDER ..............104
  1576. VUMETER ..............240       WAIT .................258
  1577. WAIT KEY .............259       WAIT VBL .............136
  1578. WAVE .................243       WHILE...WEND ......... 78
  1579. WIND CLOSE ...........102       WIND MOVE ............102
  1580. WIND SIZE ............103       WINDON ...............102
  1581. WINDOPEN ............. 99       WINDOW ...............102
  1582. WINDOW FONT ..........100       WINDSAVE .............100
  1583. WRITING .............. 89       X BOB ................162
  1584. X GRAPHIC ............ 92       X HARD ...............154
  1585. X MOUSE ..............167       X SCREEN .............153
  1586. X SPRITE .............152       XCURS ................ 94
  1587. XGR .................. 64       XTEXT ................ 91
  1588. Y BOB ................162       Y GRAPHIC ............ 92
  1589. Y HARD ...............154       Y MOUSE ..............167
  1590. Y SCREEN .............153       Y SPRITE .............153
  1591.